﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;

namespace Modelo.Seguridad
{
    public class CatalogoPerfiles
    {
        private static CatalogoPerfiles _Instancia;
        public static CatalogoPerfiles ObtenerInstancia()
        {
            if (_Instancia == null)
            {
                _Instancia = new CatalogoPerfiles();
            }
            return _Instancia;
        }

        private List<Entidades.Seguridad.Perfil> ColPerfiles;

        private CatalogoPerfiles()
        {
            ColPerfiles = Mapping.Seguridad.MappingPerfiles.ConsultarPerfiles();
        }

        public ReadOnlyCollection<Entidades.Seguridad.Perfil> ListarPerfiles()
        {
            return ColPerfiles.AsReadOnly();
        }

        public ReadOnlyCollection<Entidades.Seguridad.Perfil> ListarPerfiles(Entidades.Seguridad.Grupo oGrupo, Entidades.Seguridad.Formulario oFormulario, Entidades.Seguridad.Permiso oPermiso)
        {
            var query = from per in ColPerfiles select per;


            if (oGrupo.IdGrupo != "TODOS")
            {
                query = query.Where(p => p.Grupo.IdGrupo == oGrupo.IdGrupo);
            }
            if (oFormulario.Nombre != "TODOS")
            {
                query = query.Where(p => p.Formulario.IdFormulario == oFormulario.IdFormulario);
            }
            if (oPermiso.Nombre != "TODOS")
            {
                query = query.Where(p => p.Permiso.Nombre == oPermiso.Nombre);
            }
            
            return query.ToList().AsReadOnly();
        }

        public bool AgregarPerfil(Entidades.Seguridad.Perfil oPerfil)
        {
            ColPerfiles.Add(oPerfil);
            return Mapping.Seguridad.MappingPerfiles.AgregarPerfil(oPerfil);
        }

        public bool EliminarPerfil(Entidades.Seguridad.Perfil oPerfil)
        {
            ColPerfiles.RemoveAll(oPer => oPer.Grupo.IdGrupo == oPerfil.Grupo.IdGrupo 
                                  && oPer.Formulario.IdFormulario == oPerfil.Formulario.IdFormulario
                                  && oPer.Permiso.Nombre == oPerfil.Permiso.Nombre); 
            return Mapping.Seguridad.MappingPerfiles.EliminarPerfil(oPerfil);
        }

        public ReadOnlyCollection<Entidades.Seguridad.Perfil> RecuperarPerfilesGrupos(Entidades.Seguridad.Usuario _Usuario)
        {
            List<Entidades.Seguridad.Perfil> colPerfiles = new List<Entidades.Seguridad.Perfil>();
            foreach (Entidades.Seguridad.Grupo grupo in _Usuario.Grupos)
            {
                colPerfiles.AddRange(ColPerfiles.FindAll(delegate(Entidades.Seguridad.Perfil perfil) { return perfil.Grupo.IdGrupo == grupo.IdGrupo; }));             
            }
            return colPerfiles.AsReadOnly();
        }
    }
}
